package org.example.springboot.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.server.HttpServerResponse;
import jakarta.servlet.http.HttpServletResponse;
import org.example.springboot.common.Result;
import org.example.springboot.exception.CustomException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

//import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

//文件上传相关的接口
@RestController
@RequestMapping("/files") //给接口指定一个路径
public class FileController {
    //文件上传的路径设置为跟随系统项目的路径
    //System.getProperty("user.dir") 获取到你当前这个项目的根路径
    //文件上传的目录的路径  即在code目录下创建一个file目录
    private static final String filePath =  System.getProperty("user.dir") + "/files/";

    @PostMapping("/upload")
    public Result upload(MultipartFile file){ //以文件流的形式接受前端发送过来的文件
        //拿到前端传送过来的文件 就要拿到文件的原始文件名
        String originalFilename = file.getOriginalFilename(); //xxx.png
        //判断目录是否存在
        if(!FileUtil.isDirectory(filePath)){ //如果目录不存在 需要先创建目录
            FileUtil.mkdir(filePath);//创建一个files目录
        }
        //创建好目录则把文件写入目录里
        //提供文件存储的完整路径
        //System.currentTimeMillis()加上系统时间戳 相当于给文件名加上一个唯一标识
        String fileName = System.currentTimeMillis() + "_" + originalFilename; //文件名为：20257121134_xxx.png
        String realPath = filePath + fileName; //文件的完整路径
        try {
            //把文件写入目录里
            FileUtil.writeBytes(file.getBytes(), realPath);
        } catch (IOException e) {
            throw new CustomException("500","文件上传失败");
        }
        //写完后返回一个路径（网络连接）
        //类似于http://localhost:8080/files/download/xxx.jpg
        String url = "http://localhost:8080/files/download/" + fileName;
        return Result.success(url);
    }

     /*
     文件下载
     通过接口把文件读出来 通过接口把文件读出来 在浏览器中显示
      */
    //通过参数把要读取的文件传送过去 以文件流方式读取出来
    @GetMapping("/download/{fileName}")
    //HttpServerResponse response 可以帮我们通过流的方式把文件输出到客户端
    public void download(@PathVariable String fileName, HttpServletResponse response) {
        //设置统一编码
        response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
        response.setContentType("application/octet-stream");

        try {
            OutputStream os = response.getOutputStream();
            String realPath = filePath + fileName; //完整文件路径
            //获取到文件的字节数组
            byte[] bytes = FileUtil.readBytes(realPath);
            os.write(bytes);
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
            throw new CustomException("500","文件下载失败");
        }


    }
}
